/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.gov.fasepa.sgpf.bean;

import br.gov.fasepa.sgpf.entity.Cargo;
import br.gov.fasepa.sgpf.entity.Setor;
import br.gov.fasepa.sgpf.entity.TipoCargo;
import br.gov.fasepa.sgpf.entity.Unidade;
import br.gov.fasepa.sgpf.impressao.AtributosRelServidor;
import br.gov.fasepa.sgpf.impressao.AtributosRelUnidSetSub;
import br.gov.fasepa.sgpf.impressao.GeraRelatorio;
import br.gov.fasepa.sgpf.rn.CargoRN;
import br.gov.fasepa.sgpf.rn.SetorRN;
import br.gov.fasepa.sgpf.rn.TipoCargoRN;
import br.gov.fasepa.sgpf.rn.UnidadeRN;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;

/**
 *
 * @author marcosdj
 */
@ManagedBean
@ViewScoped
public class RelatorioBean {

    private List<AtributosRelServidor> lista = new GeraRelatorio().preencheRelatorioServidor();
    private List<AtributosRelUnidSetSub> lista2 = new GeraRelatorio().preencheRelatorioUnidades();
    private List<AtributosRelUnidSetSub> lista3;
    private List<AtributosRelUnidSetSub> lista4;
    private List<AtributosRelUnidSetSub> lista5 = new GeraRelatorio().preencheRelatorioSetores();
    private List<AtributosRelUnidSetSub> lista6 = new GeraRelatorio().preencheRelatorioSubsetores();
    private List<AtributosRelServidor> lista7;
    private List<AtributosRelUnidSetSub> lista8;
    private List<Unidade> lista9;
    private List<AtributosRelUnidSetSub> lista10;
    private String caminhoRelatorioServidor = "/WEB-INF/relatorios/relatorioAtivos.jasper";
    private String caminhoRelatorioServidorUnd = "/WEB-INF/relatorios/relServidorUnd.jasper";
    private String caminhoRelatorioServidorUnd2 = "/WEB-INF/relatorios/relServidorUnd_filtro.jasper";
    private String caminhoRelGeralAtivos = "/WEB-INF/relatorios/relatorioGeralAtivos.jasper";
    private String caminhoRelatorioUnidade = "/WEB-INF/relatorios/relatorioUnidades.jasper";
    private String caminhoRelatorioSetor = "/WEB-INF/relatorios/relatorioSetores.jasper";
    private String caminhoRelatorioSubSetor = "/WEB-INF/relatorios/relatorioSubsetores.jasper";
    private Unidade und;
    private Cargo cargo;
    private TipoCargo tipoCargo;
    private Setor setor;
    private String sexo;
    private List<Unidade> unidadeList = new UnidadeRN().obtainAll(Unidade.class);
    private List<Cargo> cargoList = new CargoRN().obtainAll(Cargo.class);
    private List<TipoCargo> tipoCargoList = new TipoCargoRN().obtainAll(TipoCargo.class);
    private List<Setor> setorList = new SetorRN().obtainAll(Setor.class);

    public RelatorioBean() {
        System.out.println(sexo);
    }
    
    public String irRelServidor() {
        return "/sistema/formRelatorio/relServidores.xhtml?faces-redirect=true";
    }

    public String irRelUnidade() {
        return "/sistema/formRelatorio/relUnidades.xhtml?faces-redirect=true";
    }
    
    public String irRelServUnd(){
        return "/sistema/formRelatorio/relServUnd.xhtml?faces-redirect=true";  
    }

    public String irRelSetorUnidade() {
        return "/sistema/formRelatorio/relSetores.xhtml?faces-redirect=true";
    }

    public String irRelSubSetorSetor() {
        return "/sistema/formRelatorio/relSubsetores.xhtml?faces-redirect=true";
    }

    public String irRelGeralSubSetor() {
        return "/sistema/formRelatorio/relGeralSubsetores.xhtml?faces-redirect=true";
    }

    public String irRelGeraSetor() {
        return "/sistema/formRelatorio/relGeralSetores.xhtml?faces-redirect=true";
    }

    public void geraRelServidorAtivos() {
        printRelatorio(lista, caminhoRelatorioServidor);
    }

    public void geraRelGeralServidorAtivos() {
        lista7 = new GeraRelatorio().preencheReltorioServidorAtivo(cargo, tipoCargo, sexo);
        printRelatorio(lista7, caminhoRelGeralAtivos);
    }

    public void geraRelatorioUnidades() {
        printRelatorio(lista2, caminhoRelatorioUnidade);
    }

    public void geraRelatorioSubsetores() {
        printRelatorio(lista6, caminhoRelatorioSubSetor);
    }

    public void geraRelatorioSetores() {
        printRelatorio(lista5, caminhoRelatorioSetor);
    }

    public void geraRelSetoresUnidade() {
        lista3 = new GeraRelatorio().preencheRelatorioSetores(und);
        printRelatorio(lista3, caminhoRelatorioSetor);
    }

    public void geraRelServidorUnidade() {
        lista8 = new GeraRelatorio().preencheRelatorioSetores(und);
        printRelatorio(lista8, caminhoRelatorioSetor);
    }

    public void geraRelSubSetoresSetor() {
        lista4 = new GeraRelatorio().preencheRelatorioSubsetores(setor);
        printRelatorio(lista4, caminhoRelatorioSubSetor);
    }

    public void geraRelServidorUnd() {
        lista9 = new GeraRelatorio().preencheRelServidorUnd(und);
        printRelatorio(lista9, caminhoRelatorioServidorUnd);
    }

    public void geraRelServidorUndFiltro() {
        lista10 = new GeraRelatorio().preencheRelServUndFiltro(und, cargo, tipoCargo);
        printRelatorio(lista10, caminhoRelatorioServidorUnd2);
    }

    private void printRelatorio(List lista, String caminhoRelatorio) {
        JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(lista);
        HashMap parameters = new HashMap();

        try {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.responseComplete();
            ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
            JasperPrint jasperPrint = JasperFillManager.fillReport(scontext.getRealPath(caminhoRelatorio), parameters, ds);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            JRPdfExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
            exporter.exportReport();

            byte[] bytes = baos.toByteArray();

            if (bytes != null && bytes.length > 0) {
                HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
                response.setContentType("application/pdf");
                response.setHeader("Content-disposition", "inline; filename=\"relatorio_de_servidores_ativos.pdf\"");
                response.setContentLength(bytes.length);
                ServletOutputStream outputStream = response.getOutputStream();
                outputStream.write(bytes, 0, bytes.length);
                outputStream.flush();
                outputStream.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Unidade getUnd() {
        return und;
    }

    public void setUnd(Unidade und) {
        this.und = und;
    }

    public List<Unidade> getUnidadeList() {
        return unidadeList;
    }

    public void setUnidadeList(List<Unidade> unidadeList) {
        this.unidadeList = unidadeList;
    }

    public List<Setor> getSetorList() {
        return setorList;
    }

    public void setSetorList(List<Setor> setorList) {
        this.setorList = setorList;
    }

    public Setor getSetor() {
        return setor;
    }

    public void setSetor(Setor setor) {
        this.setor = setor;
    }

    public Cargo getCargo() {
        return cargo;
    }

    public void setCargo(Cargo cargo) {
        this.cargo = cargo;
    }

    public TipoCargo getTipoCargo() {
        return tipoCargo;
    }

    public void setTipoCargo(TipoCargo tipoCargo) {
        this.tipoCargo = tipoCargo;
    }

    public List<Cargo> getCargoList() {
        return cargoList;
    }

    public void setCargoList(List<Cargo> cargoList) {
        this.cargoList = cargoList;
    }

    public List<TipoCargo> getTipoCargoList() {
        return tipoCargoList;
    }

    public void setTipoCargoList(List<TipoCargo> tipoCargoList) {
        this.tipoCargoList = tipoCargoList;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

}
